package com.example.string;

/**
 * 目标：String常见笔试题
 */
public class StringTest6 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
    }

    public static void test1() {
        /*
        首先这句代码String s2 = new String("abc"); 会在内存中创建两个对象
        第一个是字符串常量池中的对象,第二个是堆内存中的对象
        然后执行这句代码 String s1 = "abc"; 此时不会创建对象,因为字符串常量池中有abc对象,那么s1就直接指向字符串常量池中的对象
        最后判断s1和s2是否相等
        因为s1执行的是常量池中的地址 而s2执行的是堆内存中的地址,所以不相等 返回false
         */
        String s2 = new String("abc");
        String s1 = "abc";
        System.out.println(s1 == s2); // false
    }

    public static void test2() {
        String s1 = "abc";
        String s2 = "ab";
        // 这里是运算得出的结果,只要是运算得出的结果,那么会放在堆内存中,因此结果是false
        String s3 = s2 + "c";
        System.out.println(s1 == s3); // false
    }

    public static void test3() {
        String s1 = "abc";
        String s2 = "a" + "b" + "c";
        // 这里返回的是true,因为a,b,c的值都是确定的,Java在编译的时候会有优化,直接帮你转成"abc"存放在字符串常量池中,所以返回的结果是true
        // 如果是变量 + 一个字符串 就会存在在堆内存中,因为不确定变量的值
        System.out.println(s1 == s2); // true
    }
}
